// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// ReSharper disable CheckNamespace
// ReSharper disable CommentTypo

/* 
 * Ars Magna project, http://arsmagna.ru
 */

#region Using directives

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

#endregion

#nullable enable

namespace AM.Windows.Forms.Docking;

[ToolboxItem (false)]
public class SplitterBase : Control
{
    public SplitterBase()
    {
        SetStyle (ControlStyles.Selectable, false);
    }

    public override DockStyle Dock
    {
        get { return base.Dock; }
        set
        {
            SuspendLayout();
            base.Dock = value;

            if (Dock == DockStyle.Left || Dock == DockStyle.Right)
            {
                Width = SplitterSize;
            }
            else if (Dock == DockStyle.Top || Dock == DockStyle.Bottom)
            {
                Height = SplitterSize;
            }
            else
            {
                Bounds = Rectangle.Empty;
            }

            if (Dock == DockStyle.Left || Dock == DockStyle.Right)
            {
                Cursor = Cursors.VSplit;
            }
            else if (Dock == DockStyle.Top || Dock == DockStyle.Bottom)
            {
                Cursor = Cursors.HSplit;
            }
            else
            {
                Cursor = Cursors.Default;
            }

            ResumeLayout();
        }
    }

    protected virtual int SplitterSize
    {
        get { return 0; }
    }

    protected override void OnMouseDown (MouseEventArgs e)
    {
        base.OnMouseDown (e);

        if (e.Button != MouseButtons.Left)
        {
            return;
        }

        StartDrag();
    }

    protected virtual void StartDrag()
    {
    }

    protected override void WndProc (ref Message m)
    {
        // eat the WM_MOUSEACTIVATE message
        if (m.Msg == (int)Win32.Msgs.WM_MOUSEACTIVATE)
        {
            return;
        }

        base.WndProc (ref m);
    }
}